﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Library;

namespace Directory
{
  /// <summary>
  /// ユーザーリスト画面のフォームです。
  /// </summary>
  internal sealed partial class UserList : Form
  {
    #region プライベートフィールド
    private readonly ListBox groupListBox;
    private readonly BindingSource userBindingSource;
    #endregion

    #region パブリックコンストラクター
    /// <summary>
    /// UserList クラスの新しいインスタンスを初期化します。
    /// </summary>
    public UserList()
    {
      InitializeComponent();

      IEnumerable<IUser> users;      //ユーザーのリスト
      if (DirectoryAccess.CanConnectDomain)   //ドメインに接続できる時
      {
        users = DirectoryAccess.GetUsers<DomainUser>();   //ユーザーを取得
        userBindingSource = this.DomainUserBindingSource;
        groupListBox = this.DomainGroupListBox;
        this.LocalPanel.Visible = false;
      }
      else  //ドメインに接続できない時
      {
        users = DirectoryAccess.GetUsers<LocalUser>();  //ユーザーを取得
        userBindingSource = this.LocalUserBindingSource;
        groupListBox = this.LocalGroupListBox;
        this.DomainPanel.Visible = false;
        this.UserListBox.Height -= 32;
        this.Height -= 100;
      }
      userBindingSource.DataSource = users;
      this.UserListBox.DataSource = userBindingSource;

      this.CountLabel.Text = String.Format("{0} 個のオブジェクト", userBindingSource.Count);
      this.GroupButton.Enabled = userBindingSource.Current is DomainUser;
    }
    #endregion

    #region イベントハンドラ
    private void UserListBox_SelectedIndexChanged(object sender, EventArgs e)
    {
      if (this.UserListBox.SelectedIndex == -1)
      {
        return;
      }

      this.ShowBelongGroups();  //所属するグループを表示
    }

    private void GroupButton_Click(object sender, EventArgs e)
    {
      var user = (DomainUser)userBindingSource.Current;   //選択されたユーザー
      using (var fm = new InRoleGroupList(user))
      {
        fm.ShowDialog(this);
      }
    }
    #endregion

    #region プライベートメソッド
    /// <summary>
    /// 所属するグループを表示します。
    /// </summary>
    private void ShowBelongGroups()
    {
      var user = (IUser)userBindingSource.Current;    //選択されたユーザー
      var groups = DirectoryAccess.GetBelongGroups(user);   //ユーザーの所属するグループを取得
      groupListBox.DataSource = groups;
    }
    #endregion
  }
}
